<?php


namespace App\Controller\Test;


use App\Controller\BaseController;

use Hyperf\Coroutine\Coroutine;
use Hyperf\Coroutine\Exception\ParallelExecutionException;
use Hyperf\Coroutine\Parallel;
use Hyperf\HttpServer\Annotation\AutoController;
use function Hyperf\Coroutine\co;

#[AutoController]
class coController extends BaseController
{
    public function waitGroup()
    {
        $client = ApplicationContext::getContainer()->get(CalculatorServiceInterface::class);
        $result = $client->sum(1,3);
        var_dump($result);
        return 1;
        logInfo('waitGroup',date('Y-m-d H:i:s.u'),'start');
        $wg = new \Hyperf\Coroutine\WaitGroup();
        // 计数器加二
        $wg->add(5);
        // 创建协程 A
        co(function () use ($wg) {
            // some code
            sleep(2);
            logInfo('waitGroup',date('Y-m-d H:i:s.u'),'A');
            // 计数器减一
            $wg->done();
        });
        // 创建协程 B
        co(function () use ($wg) {
            // some code
            sleep(1);
            logInfo('waitGroup',date('Y-m-d H:i:s.u'),'B');
            // 计数器减一
            $wg->done();
        });
        // 创建协程 C
        co(function () use ($wg) {
            // some code
            sleep(1);
            logInfo('waitGroup',date('Y-m-d H:i:s.u'),'C');
            // 计数器减一
            $wg->done();
        });
        // 创建协程 C
        co(function () use ($wg) {
            // some code
            sleep(1);
            logInfo('waitGroup',date('Y-m-d H:i:s.u'),'D');
            // 计数器减一
            $wg->done();
        });
        // 创建协程 C
        co(function () use ($wg) {
            // some code
            sleep(1);
            logInfo('waitGroup',date('Y-m-d H:i:s.u'),'E');
            // 计数器减一
            $wg->done();
        });
        // 等待协程 A 和协程 B 和协程 C运行完成
        $result = $wg->wait();
        logInfo('waitGroup',date('Y-m-d H:i:s.u'),'end');
        return $result;
    }

    public function parallel()
    {
        logInfo('parallel',date('Y-m-d H:i:s'),'start');
        $parallel = new Parallel(20);
        for ($i = 0; $i < 20; $i++) {
            $parallel->add(function () {
                sleep(1);
                return Coroutine::id();
            });
        }

        try{
            $results = $parallel->wait();
            var_dump($results);
        } catch(ParallelExecutionException $e){
            // $e->getResults() 获取协程中的返回值。
            // $e->getThrowables() 获取协程中出现的异常。
        }
        logInfo('parallel',date('Y-m-d H:i:s'),'end');

    }

}